package administracion;

import java.util.ArrayList;
import java.util.List;

import auxiliares.ProductoCantidad;
import dao.DepositoDAO;
import dao.LoteDAO;
import dao.StockProductoDAO;
import entity.DCentral;
import entity.ElaboradoNoVenta;
import entity.ElaboradoVenta;
import entity.ItemReceta;
import entity.Lote;
import entity.Producto;
import entity.Receta;
import entity.StockProducto;

public class DepositoManager {

	private static DepositoManager instancia;
	private DepositoDAO dao = DepositoDAO.getInstancia();
	
	private DepositoManager() {
		
	}
	
	public static DepositoManager getInstancia(){
		if(instancia == null)
			instancia = new DepositoManager();
		return instancia;
	}


	public boolean verificarStockDepositoCentral(ElaboradoVenta p, int cantidad) {
		
		DCentral d = dao.getInstancia().getDepositoCentral();
		ElaboradoVenta ev = null;
		int cantProductos = 0;
		
		//Recupero los productos con sus stocks
		List<StockProducto> stock = StockProductoDAO.getInstancia().getStockProducto(d);
		
		//Genero una lista para llenarla con todos los productos y sus cantidades necesarias para la receta
		List<ProductoCantidad> prod = new ArrayList<ProductoCantidad>();
		
		// Buscar el producto de cada ItemReceta y verificar su disponibilidad
		for(ItemReceta item : p.getReceta().getItems()){
			
			ProductoCantidad pc = new ProductoCantidad();
			pc.setProducto(item.getProducto());
			pc.setCantidad(item.getCantidad());
			prod.add(pc);
			
			/*if(item.getProducto() instanceof ElaboradoVenta ||item.getProducto() instanceof ElaboradoNoVenta){ //tiene receta, tengo que llegar al producto base
				Receta r = ((ElaboradoVenta) item.getProducto()).getReceta();
				for(ItemReceta item2 : r.getItems()){
						if(item2.getProducto() instanceof ElaboradoVenta ||item2.getProducto() instanceof ElaboradoNoVenta){
							//Caso que tiene un nivel mas
						}else{
							prod.add(item2.getProducto());
						}
				}
			}else{
				prod.add(item.getProducto());
			}*/
		}
		
		for(StockProducto sp: stock){
			
			for(ProductoCantidad pr: prod){
				
				if(sp.getProducto().getCodigo() == pr.getProducto().getCodigo()){
					for(Lote l: sp.getLotes()){
						if(l.getCantidad() >= (pr.getCantidad()*cantidad)){ //tengo stock para ese producto
							cantProductos ++;
						}
					}
				}
			}
		}
		
		return cantProductos == prod.size();
	}

	public List<Lote> altaLotesPlanProduccion(ElaboradoVenta p, int cantidad) {
		
		List<Lote> lotes = new ArrayList<Lote>();
		
		DCentral d = dao.getInstancia().getDepositoCentral();
		
		//Recupero los productos con sus stocks
		List<StockProducto> stock = StockProductoDAO.getInstancia().getStockProducto(d);
		
		//Genero una lista para llenarla con todos los productos y sus cantidades necesarias para la receta
		List<ProductoCantidad> prod = new ArrayList<ProductoCantidad>();
		
		// Buscar el producto de cada ItemReceta y verificar su disponibilidad
		for(ItemReceta item : p.getReceta().getItems()){
			
			ProductoCantidad pc = new ProductoCantidad();
			pc.setProducto(item.getProducto());
			pc.setCantidad(item.getCantidad());
			prod.add(pc);
		}
		
		for(StockProducto sp: stock){
			
			for(ProductoCantidad pr: prod){
				
				if(sp.getProducto().getCodigo() == pr.getProducto().getCodigo()){
					for(Lote l: sp.getLotes()){
						if(l.getCantidad() >= (pr.getCantidad()*cantidad)){ //tengo stock para ese producto
							
							Lote lot = new Lote();
							lot.setCantidad(pr.getCantidad()*cantidad);
							lot.setNumero(l.getNumero());
							lot.setPlanProduccion(true);
							lot.setProducto(pr.getProducto());
							lot.setVencimiento(l.getVencimiento());
							lot.setIdLote((LoteDAO.getInstancia().getID()) + 1);
							lotes.add(lot);
							
							LoteDAO.getInstancia().save(lot);
							
							l.setCantidad(l.getCantidad() - pr.getCantidad()*cantidad);
							LoteDAO.getInstancia().update(l);
							
						}
					}
				}
			}
		}
		
		return lotes;
		
	}
	
}
